/**
 *    Copyright ${license.git.copyrightYears} the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.mybatis.generator.api;

import java.util.List;
import java.util.Properties;

import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.Document;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.Context;

/**
 * This interface defines methods that will be called at different times during the code generation process. These
 * methods can be used to extend or modify the generated code. Clients may implement this interface in its entirety, or
 * extend the PluginAdapter (highly recommended).
 * <p>
 * Plugins have a lifecycle. In general, the lifecycle is this:
 * 
 * <ol>
 * <li>The setXXX methods are called one time</li>
 * <li>The validate method is called one time</li>
 * <li>The initialized method is called for each introspected table</li>
 * <li>The clientXXX methods are called for each introspected table</li>
 * <li>The providerXXX methods are called for each introspected table</li>
 * <li>The modelXXX methods are called for each introspected table</li>
 * <li>The sqlMapXXX methods are called for each introspected table</li>
 * <li>The contextGenerateAdditionalJavaFiles(IntrospectedTable) method is called for each introspected table</li>
 * <li>The contextGenerateAdditionalXmlFiles(IntrospectedTable) method is called for each introspected table</li>
 * <li>The contextGenerateAdditionalJavaFiles() method is called one time</li>
 * <li>The contextGenerateAdditionalXmlFiles() method is called one time</li>
 * </ol>
 * 
 * Plugins are related to contexts - so each context will have its own set of plugins. If the same plugin is specified
 * in multiple contexts, then each context will hold a unique instance of the plugin.
 * <p>
 * Plugins are called, and initialized, in the same order they are specified in the configuration.
 * <p>
 * The clientXXX, modelXXX, and sqlMapXXX methods are called by the code generators. If you replace the default code
 * generators with other implementations, these methods may not be called.
 * 
 * @author Jeff Butler
 * @see PluginAdapter
 * 
 */
public interface Plugin {

  /**
   * The Enum ModelClassType.
   */
  public enum ModelClassType {

    /** The primary key. */
    PRIMARY_KEY,
    /** The base record. */
    BASE_RECORD,
    /** The record with blobs. */
    RECORD_WITH_BLOBS
  }

  /**
   * Set the context under which this plugin is running.
   *
   * @param context
   *          the new context
   */
  void setContext(Context context);

  /**
   * Set properties from the plugin configuration.
   *
   * @param properties
   *          the new properties
   */
  void setProperties(Properties properties);

  /**
   * This method is called just before the getGeneratedXXXFiles methods are called on the introspected table. Plugins
   * can implement this method to override any of the default attributes, or change the results of database
   * introspection, before any code generation activities occur. Attributes are listed as static Strings with the prefix
   * ATTR_ in IntrospectedTable.
   * <p>
   * A good example of overriding an attribute would be the case where a user wanted to change the name of one of the
   * generated classes, change the target package, or change the name of the generated SQL map file.
   * <p>
   * <b>Warning:</b> Anything that is listed as an attribute should not be changed by one of the other plugin methods.
   * For example, if you want to change the name of a generated example class, you should not simply change the Type in
   * the <code>modelExampleClassGenerated()</code> method. If you do, the change will not be reflected in other
   * generated artifacts.
   *
   * @param introspectedTable
   *          the introspected table
   */
  void initialized(IntrospectedTable introspectedTable);

  /**
   * This method is called after all the setXXX methods are called, but before any other method is called. This allows
   * the plugin to determine whether it can run or not. For example, if the plugin requires certain properties to be
   * set, and the properties are not set, then the plugin is invalid and will not run.
   * 
   * @param warnings
   *          add strings to this list to specify warnings. For example, if the plugin is invalid, you should specify
   *          why. Warnings are reported to users after the completion of the run.
   * @return true if the plugin is in a valid state. Invalid plugins will not be called
   */
  boolean validate(List<String> warnings);

  /**
   * This method can be used to generate any additional Java file needed by your implementation. This method is called
   * once, after all other Java files have been generated.
   * 
   * @return a List of GeneratedJavaFiles - these files will be saved with the other files from this run.
   */
  List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles();

  /**
   * This method can be used to generate additional Java files needed by your implementation that might be related to a
   * specific table. This method is called once for every table in the configuration.
   * 
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return a List of GeneratedJavaFiles - these files will be saved with the other files from this run.
   */
  List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles(IntrospectedTable introspectedTable);

  /**
   * This method can be used to generate any additional XML file needed by your implementation. This method is called
   * once, after all other XML files have been generated.
   * 
   * @return a List of GeneratedXmlFiles - these files will be saved with the other files from this run.
   */
  List<GeneratedXmlFile> contextGenerateAdditionalXmlFiles();

  /**
   * This method can be used to generate additional XML files needed by your implementation that might be related to a
   * specific table. This method is called once for every table in the configuration.
   * 
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return a List of GeneratedXmlFiles - these files will be saved with the other files from this run.
   */
  List<GeneratedXmlFile> contextGenerateAdditionalXmlFiles(IntrospectedTable introspectedTable);

  /**
   * This method is called when the entire client has been generated. Implement this method to add additional methods or
   * fields to a generated client interface or implementation.
   * 
   * @param interfaze
   *          the generated interface if any, may be null
   * @param topLevelClass
   *          the generated implementation class if any, may be null
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the interface should be generated, false if the generated interface should be ignored. In the case
   *         of multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

  /**
   * This method is called when the countByExample method has been generated in the client implementation class.
   * 
   * @param method
   *          the generated countByExample method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientCountByExampleMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the deleteByExample method has been generated in the client implementation class.
   * 
   * @param method
   *          the generated deleteByExample method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientDeleteByExampleMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the deleteByPrimaryKey method has been generated in the client implementation class.
   * 
   * @param method
   *          the generated deleteByPrimaryKey method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientDeleteByPrimaryKeyMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the insert method has been generated in the client implementation class.
   * 
   * @param method
   *          the generated insert method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientInsertMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

  /**
   * This method is called when the insert selective method has been generated in the client implementation class.
   * 
   * @param method
   *          the generated insert method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientInsertSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByExampleWithBLOBs method has been generated in the client implementation
   * class.
   * 
   * @param method
   *          the generated selectByExampleWithBLOBs method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientSelectByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByExampleWithoutBLOBs method has been generated in the client implementation
   * class.
   * 
   * @param method
   *          the generated selectByExampleWithoutBLOBs method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientSelectByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByPrimaryKey method has been generated in the client implementation class.
   * 
   * @param method
   *          the generated selectByPrimaryKey method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientSelectByPrimaryKeyMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleSelective method has been generated in the client implementation
   * class.
   * 
   * @param method
   *          the generated updateByExampleSelective method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByExampleSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleWithBLOBs method has been generated in the client implementation
   * class.
   * 
   * @param method
   *          the generated updateByExampleWithBLOBs method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleWithoutBLOBs method has been generated in the client implementation
   * class.
   * 
   * @param method
   *          the generated updateByExampleWithoutBLOBs method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByPrimaryKeySelective method has been generated in the client implementation
   * class.
   * 
   * @param method
   *          the generated updateByPrimaryKeySelective method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByPrimaryKeySelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByPrimaryKeyWithBLOBs method has been generated in the client implementation
   * class.
   * 
   * @param method
   *          the generated updateByPrimaryKeyWithBLOBs method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByPrimaryKeyWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByPrimaryKeyWithoutBLOBs method has been generated in the client
   * implementation class.
   * 
   * @param method
   *          the generated updateByPrimaryKeyWithBLOBs method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the countByExample method has been generated in the client interface.
   * 
   * @param method
   *          the generated countByExample method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientCountByExampleMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);

  /**
   * This method is called when the deleteByExample method has been generated in the client interface.
   * 
   * @param method
   *          the generated deleteByExample method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientDeleteByExampleMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);

  /**
   * This method is called when the deleteByPrimaryKey method has been generated in the client interface.
   * 
   * @param method
   *          the generated deleteByPrimaryKey method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientDeleteByPrimaryKeyMethodGenerated(Method method, Interface interfaze,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the insert method has been generated in the client interface.
   * 
   * @param method
   *          the generated insert method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientInsertMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);

  /**
   * This method is called when the insert selective method has been generated in the client interface.
   * 
   * @param method
   *          the generated insert method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientInsertSelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectAll method has been generated in the client interface. This method is only
   * generated by the simple runtime.
   * 
   * @param method
   *          the generated selectAll method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientSelectAllMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectAll method has been generated in the client implementation class.
   * 
   * @param method
   *          the generated selectAll method
   * @param topLevelClass
   *          the partially implemented client implementation class. You can add additional imported classes to the
   *          implementation class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientSelectAllMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByExampleWithBLOBs method has been generated in the client interface.
   * 
   * @param method
   *          the generated selectByExampleWithBLOBs method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientSelectByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByExampleWithoutBLOBs method has been generated in the client interface.
   * 
   * @param method
   *          the generated selectByExampleWithoutBLOBs method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientSelectByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByPrimaryKey method has been generated in the client interface.
   * 
   * @param method
   *          the generated selectByPrimaryKey method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientSelectByPrimaryKeyMethodGenerated(Method method, Interface interfaze,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleSelective method has been generated in the client interface.
   * 
   * @param method
   *          the generated updateByExampleSelective method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByExampleSelectiveMethodGenerated(Method method, Interface interfaze,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleWithBLOBs method has been generated in the client interface.
   * 
   * @param method
   *          the generated updateByExampleWithBLOBs method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleWithoutBLOBs method has been generated in the client interface.
   * 
   * @param method
   *          the generated updateByExampleWithoutBLOBs method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByPrimaryKeySelective method has been generated in the client interface.
   * 
   * @param method
   *          the generated updateByPrimaryKeySelective method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByPrimaryKeySelectiveMethodGenerated(Method method, Interface interfaze,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByPrimaryKeyWithBLOBs method has been generated in the client interface.
   * 
   * @param method
   *          the generated updateByPrimaryKeyWithBLOBs method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByPrimaryKeyWithBLOBsMethodGenerated(Method method, Interface interfaze,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByPrimaryKeyWithoutBLOBs method has been generated in the client interface.
   * 
   * @param method
   *          the generated updateByPrimaryKeyWithoutBLOBs method
   * @param interfaze
   *          the partially implemented client interface. You can add additional imported classes to the interface if
   *          necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(Method method, Interface interfaze,
      IntrospectedTable introspectedTable);

  /**
   * This method is called after the field is generated for a specific column in a table.
   * 
   * @param field
   *          the field generated for the specified column
   * @param topLevelClass
   *          the partially implemented model class. You can add additional imported classes to the implementation class
   *          if necessary.
   * @param introspectedColumn
   *          The class containing information about the column related to this field as introspected from the database
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @param modelClassType
   *          the type of class that the field is generated for
   * @return true if the field should be generated, false if the generated field should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn,
      IntrospectedTable introspectedTable, ModelClassType modelClassType);

  /**
   * This method is called after the getter, or accessor, method is generated for a specific column in a table.
   * 
   * @param method
   *          the getter, or accessor, method generated for the specified column
   * @param topLevelClass
   *          the partially implemented model class. You can add additional imported classes to the implementation class
   *          if necessary.
   * @param introspectedColumn
   *          The class containing information about the column related to this field as introspected from the database
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @param modelClassType
   *          the type of class that the field is generated for
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn,
      IntrospectedTable introspectedTable, ModelClassType modelClassType);

  /**
   * This method is called after the setter, or mutator, method is generated for a specific column in a table.
   * 
   * @param method
   *          the setter, or mutator, method generated for the specified column
   * @param topLevelClass
   *          the partially implemented model class. You can add additional imported classes to the implementation class
   *          if necessary.
   * @param introspectedColumn
   *          The class containing information about the column related to this field as introspected from the database
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @param modelClassType
   *          the type of class that the field is generated for
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn,
      IntrospectedTable introspectedTable, ModelClassType modelClassType);

  /**
   * This method is called after the primary key class is generated by the JavaModelGenerator. This method will only be
   * called if the table rules call for generation of a primary key class. <br>
   * <br>
   * This method is only guaranteed to be called by the Java model generators. Other user supplied generators may, or
   * may not, call this method.
   * 
   * @param topLevelClass
   *          the generated primary key class
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the class should be generated, false if the generated class should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean modelPrimaryKeyClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

  /**
   * This method is called after the base record class is generated by the JavaModelGenerator. This method will only be
   * called if the table rules call for generation of a base record class. <br>
   * <br>
   * This method is only guaranteed to be called by the default Java model generators. Other user supplied generators
   * may, or may not, call this method.
   * 
   * @param topLevelClass
   *          the generated base record class
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the class should be generated, false if the generated class should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

  /**
   * This method is called after the record with BLOBs class is generated by the JavaModelGenerator. This method will
   * only be called if the table rules call for generation of a record with BLOBs class. <br>
   * <br>
   * This method is only guaranteed to be called by the default Java model generators. Other user supplied generators
   * may, or may not, call this method.
   * 
   * @param topLevelClass
   *          the generated record with BLOBs class
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the class should be generated, false if the generated class should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

  /**
   * This method is called after the example class is generated by the JavaModelGenerator. This method will only be
   * called if the table rules call for generation of an example class. <br>
   * <br>
   * This method is only guaranteed to be called by the default Java model generators. Other user supplied generators
   * may, or may not, call this method.
   * 
   * @param topLevelClass
   *          the generated example class
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the class should be generated, false if the generated class should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

  /**
   * This method is called when the SqlMap file has been generated.
   * 
   * @param sqlMap
   *          the generated file (containing the file name, package name, and project name)
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the sqlMap should be generated, false if the generated sqlMap should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable);

  /**
   * This method is called when the SqlMap document has been generated. This method can be used to add additional XML
   * elements the the generated document.
   * 
   * @param document
   *          the generated document (note that this is the MyBatis generator's internal Document class - not the w3c
   *          XML Document class)
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the document should be generated, false if the generated document should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins. Also, if
   *         any plugin returns false, then the <tt>sqlMapGenerated</tt> method will not be called.
   */
  boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable);

  /**
   * This method is called when the base resultMap is generated.
   * 
   * @param element
   *          the generated &lt;resultMap&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapResultMapWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the countByExample element is generated.
   * 
   * @param element
   *          the generated &lt;select&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapCountByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the deleteByExample element is generated.
   * 
   * @param element
   *          the generated &lt;delete&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapDeleteByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the deleteByPrimaryKey element is generated.
   * 
   * @param element
   *          the generated &lt;delete&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapDeleteByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the exampleWhereClause element is generated.
   * 
   * @param element
   *          the generated &lt;sql&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapExampleWhereClauseElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the baseColumnList element is generated.
   * 
   * @param element
   *          the generated &lt;sql&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapBaseColumnListElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the blobColumnList element is generated.
   * 
   * @param element
   *          the generated &lt;sql&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapBlobColumnListElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the insert element is generated.
   * 
   * @param element
   *          the generated &lt;insert&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapInsertElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the insert selective element is generated.
   * 
   * @param element
   *          the generated &lt;insert&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapInsertSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the resultMap with BLOBs element is generated - this resultMap will extend the base
   * resultMap.
   * 
   * @param element
   *          the generated &lt;resultMap&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapResultMapWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectAll element is generated.
   * 
   * @param element
   *          the generated &lt;select&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapSelectAllElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByPrimaryKey element is generated.
   * 
   * @param element
   *          the generated &lt;select&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapSelectByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByExample element is generated.
   * 
   * @param element
   *          the generated &lt;select&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByExampleWithBLOBs element is generated.
   * 
   * @param element
   *          the generated &lt;select&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleSelective element is generated.
   * 
   * @param element
   *          the generated &lt;update&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapUpdateByExampleSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleWithBLOBs element is generated.
   * 
   * @param element
   *          the generated &lt;update&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapUpdateByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleWithourBLOBs element is generated.
   * 
   * @param element
   *          the generated &lt;update&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapUpdateByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByPrimaryKeySelective element is generated.
   * 
   * @param element
   *          the generated &lt;update&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapUpdateByPrimaryKeySelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByPrimaryKeyWithBLOBs element is generated.
   * 
   * @param element
   *          the generated &lt;update&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapUpdateByPrimaryKeyWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByPrimaryKeyWithoutBLOBs element is generated.
   * 
   * @param element
   *          the generated &lt;update&gt; element
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the element should be generated, false if the generated element should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable);

  /**
   * This method is called when the SQL provider has been generated. Implement this method to add additional methods or
   * fields to a generated SQL provider.
   * 
   * @param topLevelClass
   *          the generated provider
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the provider should be generated, false if the generated provider should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable);

  /**
   * This method is called when the applyWhere method has been generated in the SQL provider.
   * 
   * @param method
   *          the generated applyWhere method
   * @param topLevelClass
   *          the partially generated provider class You can add additional imported classes to the class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerApplyWhereMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the countByExample method has been generated in the SQL provider.
   * 
   * @param method
   *          the generated countByExample method
   * @param topLevelClass
   *          the partially generated provider class You can add additional imported classes to the class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerCountByExampleMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the deleteByExample method has been generated in the SQL provider.
   * 
   * @param method
   *          the generated deleteByExample method
   * @param topLevelClass
   *          the partially generated provider class You can add additional imported classes to the class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerDeleteByExampleMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the insertSelective method has been generated in the SQL provider.
   * 
   * @param method
   *          the generated insertSelective method
   * @param topLevelClass
   *          the partially generated provider class You can add additional imported classes to the class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerInsertSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByExampleWithBLOBs method has been generated in the SQL provider.
   * 
   * @param method
   *          the generated selectByExampleWithBLOBs method
   * @param topLevelClass
   *          the partially generated provider class You can add additional imported classes to the class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerSelectByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the selectByExampleWithoutBLOBs method has been generated in the SQL provider.
   * 
   * @param method
   *          the generated selectByExampleWithoutBLOBs method
   * @param topLevelClass
   *          the partially generated provider class You can add additional imported classes to the class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerSelectByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleSelective method has been generated in the SQL provider.
   * 
   * @param method
   *          the generated updateByExampleSelective method
   * @param topLevelClass
   *          the partially generated provider class You can add additional imported classes to the class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerUpdateByExampleSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleWithBLOBs method has been generated in the SQL provider.
   * 
   * @param method
   *          the generated updateByExampleWithBLOBs method
   * @param topLevelClass
   *          the partially generated provider class You can add additional imported classes to the class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerUpdateByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByExampleWithoutBLOBs method has been generated in the SQL provider.
   * 
   * @param method
   *          the generated updateByExampleWithoutBLOBs method
   * @param topLevelClass
   *          the partially generated provider class You can add additional imported classes to the class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerUpdateByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);

  /**
   * This method is called when the updateByPrimaryKeySelective method has been generated in the SQL provider.
   * 
   * @param method
   *          the generated updateByPrimaryKeySelective method
   * @param topLevelClass
   *          the partially generated provider class You can add additional imported classes to the class if necessary.
   * @param introspectedTable
   *          The class containing information about the table as introspected from the database
   * @return true if the method should be generated, false if the generated method should be ignored. In the case of
   *         multiple plugins, the first plugin returning false will disable the calling of further plugins.
   */
  boolean providerUpdateByPrimaryKeySelectiveMethodGenerated(Method method, TopLevelClass topLevelClass,
      IntrospectedTable introspectedTable);
}
